11.6 組込み手続きとモジュール
-
[6.2]
組み込みサブルーチン
MOVE_ALLOCに、省略可能なSTATおよびERRMSG引数が追加されました。STAT引数は、整数型で、小数点以下の範囲が4以上である必要があります(つまり、8ビット整数ではありません)。 サブルーチンが正常に実行された場合は値ゼロが割り当てられ、それ以外の場合はゼロ以外の値が割り当てられます。ERRMSG引数は、基本種別の文字型である必要があります。STATが存在し、ゼロ以外の値が割り当てられている場合、ERRMSGには説明メッセージが割り当てられます(存在する場合)。 それ以外の場合、ERRMSGは以前の値(存在する場合)を保持します。例)
INTEGER,ALLOCATABLE :: x(:),y(:) INTEGER istat CHARACTER(80) emsg ... CALL MOVE_ALLOC(x,y,istat,emsg) IF (istat/=0) THEN PRINT *,'Unexpected error in MOVE_ALLOC: ',TRIM(emsg)これらの引数の目的は、
STAT_STOPPED_IMAGEやSTAT_FAILED_IMAGEなどの複数の像の共配列の割付け/割付け解除のエラーをキャッチすることです。 -
[7.1]
組込み関数
ALL、ANY、FINDLOC、IALL、IANY、IPARITY、MAXLOC、MAXVAL、MINLOC、MINVAL、NORM2、PARITY、PRODUCT、及びSUMのDIM引数は実行時に存在する限り、省略可能な仮引数にすることができます。
例)Subroutine sub(x,n) Real,Intent(In) :: x(:,:,:) Integer,Intent(In),Optional :: n If (Present(n)) Then Print *,Norm2(x,n) ! Rank two array result. Else Print *,Norm2(x) ! Scalar result. End If End Subroutine -
[7.1]
個別組込み関数は廃止されたと見なされます(-f2018オプションでそのように報告されます)。
個別でも総称でもある関数(例えば
SQRT)の廃止された使用法は、 実引数として渡すか、手続引用仕様として使用するか、手続きポインタ割付け指示先となるかです。 -
[7.1]
組込照会関数
RANKは、引数の次元を返します。 書式は次のとおりです。RANK ( A )
A: 任意の型のデータ実体結果 : 基本種別のスカラ整数
結果は
Aの次元数です。つまりAがスカラの場合はゼロ、Aが1次元配列の場合は1、等々。この関数は、
Aが次元数引継ぎ変数である場合を除いて、定数式で使用できます。 -
[7.1]
組込み関数
REDUCEは、ユーザー定義の配列集約を実行します。 書式は次のとおりです。REDUCE ( ARRAY, OPERATION [, MASK, IDENTITY, ORDERED ] ) or REDUCE ( ARRAY, OPERATION DIM [, MASK, IDENTITY, ORDERED ] )
ARRAY:任意の型の配列OPERATION:2つの引数を持つ純粋関数。各引数は、ARRAYと同じ宣言型および型パラメータを持つ、スカラ、非割り付け可能、非ポインター、非多態性の非省略可能変数です。 一方の引数にASYNCHRONOUS、TARGET、またはVALUE属性がある場合、もう一方にもその属性が必要です。 結果は、ARRAYと同じ型および型パラメーターを持つ非多相スカラ変数である必要があります。DIM:1からNの範囲のスカラ整数。ここでNはARRAYの次元数です。MASK:論理型でARRAYと同じ形状のスカラまたは配列IDENTITY:ARRAYと同じ宣言された型と型パラメタを持つスカラORDERED:論理型のスカラ結果:
ARRAYと同じ型および型パラメタ。結果は、ユーザー指定の
OPERATIONによってARRAYが集約されます。DIMが存在しない場合、(マスクされた)ARRAY全体がスカラ結果に集約されます。DIMが存在する場合、結果の次元数はN-1になり、ARRAYの形状は次元DIMが集約されます。 結果の各要素は、その次元のマスクされた要素の集約です。正確に1つの要素が結果値に寄与する場合、その値は要素と等しくなります。つまり、
OPERATIONは、複数の要素が表示された場合にのみ呼び出されます。結果値に寄与する要素がない場合は、
IDENTITY引数が存在する必要があり、その値はIDENTITYと同じです。例)
Module triplet_m Type triplet Integer i,j,k End Type Contains Pure Type(triplet) Function tadd(a,b) Type(triplet),Intent(In) :: a,b tadd%i = a%i + b%i tadd%j = a%j + b%j tadd%k = a%k + b%k End Function End Module Program reduce_example Use triplet_m Type(triplet) a(2,3) a = Reshape( [ triplet(1,2,3),triplet(1,2,4), & triplet(2,2,5),triplet(2,2,6), & triplet(3,2,7),triplet(3,2,8) ], [ 2,3 ] ) Print 1, Reduce(a,tadd) Print 1, Reduce(a,tadd,1) Print 1, Reduce(a,tadd,a%i/=2) Print 1, Reduce(Array=a,Dim=2,Operation=tadd) Print 1, Reduce(a, Mask=a%i/=2, Dim=1, Operation=tadd, Identity=triplet(0,0,0)) 1 Format(1x,6('triplet(',I0,',',I0,',',I0,')',:,'; ')) End Program上記コードは以下を出力しますtriplet(12,12,33) triplet(2,4,7); triplet(4,4,11); triplet(6,4,15) triplet(8,8,22) triplet(6,6,15); triplet(6,6,18) triplet(2,4,7); triplet(0,0,0); triplet(6,4,15)
-
[7.0]
組込みのATOMICサブルーチン
ATOMIC_ADD、ATOMIC_AND、ATOMIC_CAS、ATOMIC_FETCH_ADD、ATOMIC_FETCH_AND、ATOMIC_FETCH_OR、ATOMIC_FETCH_XOR、ATOMIC_OR、及びATOMIC_XORは、高度な共配列プログラミングで説明されています。 -
[7.1]
個別集約サブルーチン
CO_BROADCAST、CO_MAX、CO_MIN、CO_REDUCE、およびCO_SUMは、高度な共配列プログラミングで説明されています。 -
[7.0]
組込み関数
COSHAPE、EVENT_QUERY、FAILED_IMAGES、GET_TEAM、IMAGE_STATUS、STOPPED_IMAGES、およびTEAM_NUMBER、および組み込み関数NUM_IMAGES、及びTHIS_IMAGEは、高度な共配列プログラミングで説明されています。
